package infb.dao;

import infb.modelo.Medicos;
import infb.modelo.Pacientes;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless(mappedName = "PacientesEJB")
public class PacientesBean implements PacientesInterfaz {

    @PersistenceContext
    private EntityManager em;

    public void create(Pacientes pacientes) {
        em.persist(pacientes);
    }

    public void edit(Pacientes pacientes) {
        em.merge(pacientes);
    }

    public void remove(Pacientes pacientes) {
        em.remove(em.merge(pacientes));
    }

    public Pacientes find(Object id) {
        return em.find(Pacientes.class, id);
    }

    public List<Pacientes> findAll() {
        return em.createQuery("select p from Pacientes p order by p.apellido1,p.apellido2,p.nombre asc").getResultList();
    }

    /*
     * Metodo para comprobar si un usuario esta correctamente registrado en el sistema
     * Utilizado por el mecanismo de autenticacion
     */
    public Pacientes estaAutenticado(String tarjetaSanitaria, String password) {
        List resultados = em.createQuery("SELECT p FROM Pacientes p where p.tarjetaSanitaria=?1 and p.password=?2")
        .setParameter(1, tarjetaSanitaria)
        .setParameter(2, password)
        .getResultList();

        return (Pacientes) (resultados.isEmpty() ? null : resultados.get(0));
    }

    public Pacientes buscarPorTarjetaSanitaria(String tarjetaSanitaria) {
        Pacientes p = (Pacientes)em.createQuery("select p from Pacientes p where p.tarjetaSanitaria LIKE ?1")
                      .setParameter(1, tarjetaSanitaria)
                      .getSingleResult();
        return p;
    }

    public List<Pacientes> buscarPorMedico(Medicos medico) {
        List<Pacientes> res;
       
        res = (List<Pacientes>) em.createQuery("select object(p) from Pacientes p where p.medico=?1")
                .setParameter(1, medico)
                .getResultList();
        
        return res;

    }
  

    /*
     * Metodo asociado al formulario de busqueda de pacientes
     */
    public List busquedaAvanzada(String tarjetaSanitaria, String identificacion, String apellido1, String apellido2, String nombre) {
        tarjetaSanitaria=tarjetaSanitaria.toUpperCase();
        identificacion=identificacion.toUpperCase();
        apellido1=apellido1.toUpperCase();
        apellido2=apellido2.toUpperCase();
        nombre=nombre.toUpperCase();

        boolean hayWhere=false;
        String sql="select p from Pacientes p ";
        if(!tarjetaSanitaria.equals("")){
            sql+=!hayWhere?"where upper(p.tarjetaSanitaria) like ?1 ":"and upper(p.tarjetaSanitaria) like ?1 ";
            hayWhere=true;
        }
        if(!identificacion.equals("")){
            sql+=!hayWhere?"where upper(p.identificacion) like ?2 ":"and upper(p.identificacion) like ?2 ";
            hayWhere=true;
        }
        if(!apellido1.equals("")){
            sql+=!hayWhere?"where upper(p.apellido1) like ?3 ":"and upper(p.apellido1) like ?3 ";
            hayWhere=true;
        }
        if(!apellido2.equals("")){
            sql+=!hayWhere?"where upper(p.apellido2) like ?4 ":"and upper(p.apellido2) like ?4 ";
            hayWhere=true;
        }
        if(!nombre.equals("")){
            sql+=!hayWhere?"where upper(p.nombre) like ?5 ":"and upper(p.nombre) like ?5 ";
            hayWhere=true;
        }
        sql+="order by p.apellido1,p.apellido2,p.nombre asc";
        Query consulta=em.createQuery(sql);
        if(!tarjetaSanitaria.equals("")){
            consulta.setParameter(1, tarjetaSanitaria+"%");
        }
        if(!identificacion.equals("")){
            consulta.setParameter(2, identificacion+"%");
        }
        if(!apellido1.equals("")){
            consulta.setParameter(3, apellido1+"%");
        }
        if(!apellido2.equals("")){
            consulta.setParameter(4, apellido2+"%");
        }
        if(!nombre.equals("")){
            consulta.setParameter(5, nombre+"%");
        }

        return consulta.getResultList();

    }

}
